home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / sossnt.zip / SOSSNT / SRC / MOUNTD.C < prev    next >
C/C++ Source or Header  |  1993-03-03  |  5KB  |  201 lines

  1. /*
  2.  *  mountd.c --
  3.  *      Mount daemon program for PC NFS.  Runs on top of the net daemon
  4.  *      (netd.c).  This is a partial implementation of the UNIX mount
  5.  *      daemon mountd(8c).
  6.  *
  7.  *  Author:
  8.  *      See-Mong Tan, 6/12/88]
  9.  */
  10.  
  11. #include "common.h"
  12.  
  13. static void expreply (struct svc_req *, SVCXPRT *);
  14.  
  15. /*
  16.  *  bool_t mountd_init() --
  17.  *      Mount daemon initialization.  Creates and registers transport
  18.  *      handle, and sets exports in the file EXPORTS.
  19.  */
  20. bool_t mountd_init()
  21. {
  22.     SOCKET sock;
  23.     SOCKADDR_IN local_sin;
  24.     SVCXPRT *transp;
  25.  
  26.     sock = socket( PF_INET, SOCK_DGRAM, 0);
  27.     if (sock == INVALID_SOCKET) {
  28.         (void) fprintf(stderr, "cannot create mountd socket\n");
  29.         return FALSE;
  30.     }
  31.  
  32.     local_sin.sin_family = AF_INET;
  33.     local_sin.sin_port = htons(MOUNTPORT);
  34.     local_sin.sin_addr.s_addr = INADDR_ANY;
  35.  
  36.       if (bind( sock,(SOCKADDR *)(&local_sin), sizeof(local_sin)) == SOCKET_ERROR) {
  37.         fprintf(stderr,"bind() failed");
  38.         return FALSE;
  39.     }
  40.  
  41.     if ((transp = svcudp_create(sock, 0, local_sin.sin_port)) == (SVCXPRT *) NULL) {
  42.         (void) fprintf (stderr, "mountd: cannot create udp handle");
  43.         closesocket(sock);
  44.         return FALSE;
  45.     }
  46.     if (! svc_register(transp, MOUNTPROG, MOUNTVERS, mountd_dispatch, 
  47.         IPPROTO_UDP)) {
  48.         (void) fprintf(stderr, "mountd: cannot register transport\n");
  49.         closesocket(sock);
  50.         return FALSE;
  51.     }
  52.     if (! svc_register(transp, MOUNTPROG, MOUNTVERS_OLD, mountd_dispatch, 
  53.         IPPROTO_UDP)) {
  54.         (void) fprintf(stderr, "mountd: warning: cannot register old version\n");
  55.     }
  56.     if (! exps_parse()) {
  57.         (void) fprintf(stderr, "mountd: cannot parse exports file\n");
  58.         closesocket(sock);
  59.         return FALSE;
  60.     }
  61.     
  62.     return TRUE;
  63. }
  64.  
  65. /*
  66.  *  void mountd_dispatch(struct svc_req *req, SVCXPRT *xprt) --
  67.  *      Dispatch routine for the mount daemon.
  68.  */
  69. void mountd_dispatch(req, xprt)
  70.     struct svc_req *req;
  71.     SVCXPRT *xprt;
  72. {
  73. #if DEBUG
  74. static char *names[] = {"NULL", "MNT", "DUMP", "UMNT", "UMNTALL",
  75.             "EXPORT", "EXPORTALL", "<invalid>"};
  76.     DBGPRT1 (mountd, ">>> MOUNTPROC_%s", names[(req->rq_proc >
  77.         MOUNTPROC_EXPORTALL) ? MOUNTPROC_EXPORTALL+1 : req->rq_proc]);
  78. #endif
  79.  
  80.     switch((int) req->rq_proc) {
  81.  
  82.       case NULLPROC:            /* "ping" the mount daemon */
  83.     if (! svc_sendreply(xprt, xdr_void, 0)) {
  84.         (void) fprintf(stderr, "mountd: cannot send reply\n");
  85.         return;
  86.     }
  87.     break;
  88.     
  89.       case MOUNTPROC_MNT:    mount(req, xprt);    break;
  90.       case MOUNTPROC_UMNT:    unmount(req, xprt);    break;
  91.       case MOUNTPROC_EXPORT:    expreply(req, xprt);    break;
  92.       case MOUNTPROC_DUMP:
  93.       case MOUNTPROC_UMNTALL:
  94.       case MOUNTPROC_EXPORTALL:
  95.  
  96.       default:
  97.     svcerr_noproc(xprt);
  98.     }
  99. }        
  100.  
  101. /*
  102.  *  void mount(struct svc_req *req, SVCXPRT *xprt) --
  103.  *      Services a mount request
  104.  */
  105. void mount(req, xprt)
  106.     struct svc_req *req;
  107.     SVCXPRT *xprt;
  108. {
  109.     char *path = NULL;
  110.     struct fhstatus fhs;        /* file handle status */
  111.     SOCKADDR_IN local_sin;
  112.  
  113.     if (! svc_getargs(xprt, xdr_path, &path)) {
  114.             DBGPRT0 (mountd, "cannot decode mount path");
  115.         svcerr_decode(xprt);
  116.         return;
  117.     }
  118.     DBGPRT1 (mountd, "path: %s", path);
  119.     local_sin = *(svc_getcaller(xprt));
  120.     if (! exps_isclnt(path, local_sin.sin_addr.s_addr)) {
  121.             DBGPRT0 (mountd, "access denied");
  122.         fhs.fhs_status = NFSERR_ACCES;
  123.     }
  124.     else if (! mntpntofh(path, &(fhs.fhs_fh))) {
  125.             DBGPRT0 (mountd, "illegal path");
  126.         fhs.fhs_status = (int) NFSERR_NOENT;
  127.     }
  128.     else 
  129.         fhs.fhs_status = (int) NFS_OK;
  130.  
  131.     /* reply to caller */
  132.     if (! svc_sendreply(xprt, xdr_fhstatus, &fhs))
  133.         (void) fprintf(stderr, "mount: cannot reply to mount req\n");
  134.  
  135.     svc_freeargs(xprt, xdr_path, &path);
  136. }
  137.  
  138. /*
  139.  *  void unmount(struct svc_req *req, SVCXPRT *xprt) --
  140.  *      Unmount a filesystem.
  141.  */
  142. void unmount(req, xprt)
  143.     struct svc_req *req;
  144.     SVCXPRT *xprt;
  145. {
  146.     char *path = NULL;
  147.     fhandle_t fh;
  148.     
  149.     if (! svc_getargs(xprt, xdr_path, &path)) {
  150.             DBGPRT0 (mountd, "unmount: cannot decode");
  151.         svcerr_decode(xprt);
  152.         return;
  153.     }
  154.     DBGPRT1 (mountd, "unmounting %s", path);
  155.     if (! mntpntofh(path, &fh))
  156.         DBGPRT0 (mountd, "unmount: not in mount list");
  157.  
  158.     if (! svc_sendreply(xprt, xdr_void, NULL)) {
  159.         (void) fprintf(stderr, "unmount: cannot send reply\n");
  160.     }
  161.     svc_freeargs(xprt, xdr_path, &path);
  162. }
  163.         
  164. /*
  165.  *  void expreply(struct svc_req *req, SVCXPRT *xprt) --
  166.  *      Services an exports request
  167.  */
  168. void expreply(req, xprt)
  169.      struct svc_req *req;
  170.      SVCXPRT *xprt;
  171. {
  172.     struct exports *exp_list;
  173.  
  174.     exp_list = exps_get ();
  175.  
  176.     /* reply to caller */
  177.     if (! svc_sendreply(xprt, xdr_exports, &exp_list))
  178.       (void) fprintf(stderr, "mount: cannot reply to export req\n");
  179. }
  180.  
  181. /*
  182.  *  bool_t mntpntofh(char *path, fhandle_t *fhp) --
  183.  *      Checks that path matches something in the export list and
  184.  *      converts the path name to file status handle.
  185.  */
  186. bool_t mntpntofh(path, fhp)
  187.     char *path;
  188.     fhandle_t *fhp;
  189. {
  190.     Exports *ptr;
  191.  
  192.     if ((ptr = exps_isexport(path)) == NULL) {    /* not in list */
  193.             DBGPRT1 (mountd, "path \"%s\" not in export list", path);
  194.         return FALSE;
  195.     }
  196.     /* anything in export list should already be in directory tree cache */
  197.     *fhp = pntofh (path);
  198.     return TRUE;
  199. }
  200.  
  201.